/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.jm.mala.relatorio;

import br.jm.mala.entity.Categoria;
import br.jm.mala.entity.CategoriaGrupo;
import br.jm.mala.lazyModel.GenericDataModel;
import br.jm.mala.service.CategoriaGrupoService;
import br.jm.mala.service.CategoriaService;
import br.jm.mala.util.Conecta;
import br.jm.mala.util.UtilFaces;
import br.jm.mala.view.UserSession;
import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JRRuntimeException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.fill.JRAbstractLRUVirtualizer;
import net.sf.jasperreports.engine.fill.JRGzipVirtualizer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

/**
 *
 * @author joao
 */
@Component("relatorioView")
@Scope("view")
public class RelatorioView implements Serializable {

    private static final long serialVersionUID = 6313819126643413975L;

    private GenericDataModel listCategoria;
    private Categoria[] selectedCategoria;
    private final List<Categoria> categoriaData;
    private GenericDataModel listCategoriaGrupo;
    private CategoriaGrupo[] selectedCategoriaGrupo;
    private final List<CategoriaGrupo> categoriaGrupoData;
    private String saida;
    private String nomeRelatorio;
    private String nomePDF;
    private Conecta conecta;
    private String cWhere;
    private String cOrder;
    private int nrel;
    private int nordem;
    private FacesMessage msg;

    @Autowired
    private UserSession sessionUser;
    private final CategoriaGrupoService categoriaGrupoService;
    private final CategoriaService categoriaService;

    @Autowired
    public RelatorioView(CategoriaService categoriaService, CategoriaGrupoService categoriaGrupoService) {
        this.categoriaService = categoriaService;
        this.categoriaGrupoService = categoriaGrupoService;
        this.categoriaData = this.categoriaService.loadAll();
        this.listCategoria = new GenericDataModel(this.categoriaData);
        this.categoriaGrupoData = this.categoriaGrupoService.loadAll();
        this.listCategoriaGrupo = new GenericDataModel(this.categoriaGrupoData);
        this.conecta = new Conecta();
        this.nrel = 1;
        this.nordem = 1;
    }

    public GenericDataModel getListCategoria() {
        return listCategoria;
    }

    public void setListCategoria(GenericDataModel listCategoria) {
        this.listCategoria = listCategoria;
    }

    public Categoria[] getSelectedCategoria() {
        return selectedCategoria;
    }

    public void setSelectedCategoria(Categoria[] selectedCategoria) {
        this.selectedCategoria = selectedCategoria;
    }

    public GenericDataModel getListCategoriaGrupo() {
        return listCategoriaGrupo;
    }

    public void setListCategoriaGrupo(GenericDataModel listCategoriaGrupo) {
        this.listCategoriaGrupo = listCategoriaGrupo;
    }

    public CategoriaGrupo[] getSelectedCategoriaGrupo() {
        return selectedCategoriaGrupo;
    }

    public void setSelectedCategoriaGrupo(CategoriaGrupo[] selectedCategoriaGrupo) {
        this.selectedCategoriaGrupo = selectedCategoriaGrupo;
    }

    public int getNordem() {
        return nordem;
    }

    public void setNordem(int nordem) {
        this.nordem = nordem;
    }

    public void geraRelatorio() {
        this.cWhere = "";
        this.cOrder = "";
        msg = null;
        this.conecta = new Conecta();
        boolean lPassa = false;

        String usuario = sessionUser.getUser().getUsername();

        try {
            Map<String, Object> parametros = new HashMap<>();

            if (nrel == 1 || nrel == 2) {
                if (this.selectedCategoria.length == 0) {
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Chamar o Relatório!", "SELECIONE PELO MENOS UMA CATEGORIA ...");
                } else {
                    if (nrel == 1) {
                        this.nomeRelatorio = "relCategoria.jasper";
                        this.nomePDF = "categoria_simples_".concat(usuario).concat(".pdf");
                        msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Chamada ao Relatório efetuada com Sucesso!", "RELATÓRIO SIMPLES");
                    } else {
                        this.nomeRelatorio = "relCategoriaGrupo.jasper";
                        this.nomePDF = "categoria_completo_".concat(usuario).concat(".pdf");
                        msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Chamada ao Relatório efetuada com Sucesso!", "RELATÓRIO COMPLETO");
                    }

                    this.cOrder = " ORDER BY categoria.dsc_categoria ";
                    this.cWhere = " where categoria.id_categoria in ( ";

                    for (Categoria selectedCategoria1 : this.selectedCategoria) {
                        this.cWhere += selectedCategoria1.getIdCategoria() + ",";
                    }
                    this.cWhere += "0) ";
                    lPassa = true;
                }
            } else if (nrel == 3) {
                if (this.selectedCategoriaGrupo.length == 0) {
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Chamar o Relatório!", "SELECIONE PELO MENOS UMA CATEGORIA ...");
                } else {
                    this.nomeRelatorio = "relRamoAtividade.jasper";
                    this.nomePDF = "ramo_atividade_".concat(usuario).concat(".pdf");
                    this.cWhere = " where categoria_grupo.id_grupo in ( ";
                    for (CategoriaGrupo selectedCategoriaGrupo1 : this.selectedCategoriaGrupo) {
                        this.cWhere += selectedCategoriaGrupo1.getIdGrupo() + ",";
                    }
                    this.cWhere += "0) ";
                    if (this.nordem == 1) {
                        this.cOrder = " ORDER BY atividade.descmix ";
                    } else if (this.nordem == 2) {
                        this.cOrder = " ORDER BY atividade.codmix ";
                    } else if (this.nordem == 3) {
                        this.cOrder = " ORDER BY categoria_grupo.dsc_grupo ";
                    }
                    lPassa = true;
                    msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Chamada ao Relatório efetuada com Sucesso!", "RELATÓRIO RAMO DE ATIVIDADE");
                }
            } else if (nrel >= 4 && nrel <= 9) {
                if (this.selectedCategoriaGrupo.length == 0) {
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Chamar o Relatório!", "SELECIONE PELO MENOS UMA CATEGORIA ...");
                } else {
                    lPassa = true;
                    this.cWhere = " where categoria_grupo.id_grupo in ( ";
                    for (CategoriaGrupo selectedCategoriaGrupo1 : this.selectedCategoriaGrupo) {
                        this.cWhere += selectedCategoriaGrupo1.getIdGrupo() + ",";
                    }
                    this.cWhere += "0) ";
                    if (this.nordem == 1) {
                        this.cOrder = " ORDER BY suc ";
                    } else if (this.nordem == 2) {
                        this.cOrder = " ORDER BY fantasia ";
                    } else if (this.nordem == 3) {
                        this.cOrder = " ORDER BY razsoc ";
                    } else if (this.nordem == 4) {
                        this.cOrder = " ORDER BY dsc_grupo ";
                    } else if (this.nordem == 5) {
                        this.cOrder = " ORDER BY contato ";
                    } else if (this.nordem == 6) {
                        this.cOrder = " ORDER BY descmix ";
                    }

                    if (nrel == 4) {
                        this.nomeRelatorio = "relSuc_simples.jasper";
                        this.nomePDF = "suc_simples_".concat(usuario).concat(".pdf");
                        msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Chamada ao Relatório efetuada com Sucesso!", "RELATÓRIO SUC SIMPLES");
                    } else if (nrel == 5) {
                        this.nomeRelatorio = "relSuc_completo.jasper";
                        this.nomePDF = "suc_completo_".concat(usuario).concat(".pdf");
                        msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Chamada ao Relatório efetuada com Sucesso!", "RELATÓRIO SUC COMPLETO");
                    } else if (nrel == 6) {
                        this.nomeRelatorio = "relSuc_atividade.jasper";
                        this.nomePDF = "suc_atividade_".concat(usuario).concat(".pdf");
                        msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Chamada ao Relatório efetuada com Sucesso!", "RELATÓRIO SUC POR RAMO DE ATIVIDADE");
                    } else if (nrel == 7) {
                        this.nomeRelatorio = "relSuc_razsoc.jasper";
                        this.nomePDF = "suc_razsoc_".concat(usuario).concat(".pdf");
                        msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Chamada ao Relatório efetuada com Sucesso!", "RELATÓRIO SUC POR RAZÃO SOCIAL");
                    } else if (nrel == 8) {
                        this.nomeRelatorio = "relSuc_fantasia.jasper";
                        this.nomePDF = "suc_fantasia_".concat(usuario).concat(".pdf");
                        msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Chamada ao Relatório efetuada com Sucesso!", "RELATÓRIO SUC POR FANTASIA");
                    } else if (nrel == 9) {
                        this.nomeRelatorio = "relSuc_suc.jasper";
                        this.nomePDF = "suc_suc_".concat(usuario).concat(".pdf");
                        msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Chamada ao Relatório efetuada com Sucesso!", "RELATÓRIO SUC POR SUC");
                    }
                }
            }
            if (lPassa) {
                this.executarRelatorio2(nomeRelatorio, parametros);
            }
            //this.enviarPdf(nomeRelatorio, parametros);
            conecta.close();
        } catch (SQLException ex) {
            Logger.getLogger(RelatorioView.class.getName()).log(Level.SEVERE, null, ex);
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Chamar o Relatório!", "Verifique se o Acrobat Read esta Instalado ...");
        } catch (IOException ex) {
            Logger.getLogger(RelatorioView.class.getName()).log(Level.SEVERE, null, ex);
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Chamar o Relatório!", "Verifique se o Existe Algum Relatório Aberto ...");
        } catch (JRException ex) {
            Logger.getLogger(RelatorioView.class.getName()).log(Level.SEVERE, null, ex);
        } catch (JRRuntimeException ex) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Chamar o Relatório!", "VERIFIQUE SE EXISTE ALGUM RELATÓRIO JÁ ABERTO ...");
        } finally {
            this.nrel = 1;
            this.nordem = 1;
            this.selectedCategoria = null;
            this.selectedCategoriaGrupo = null;
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }
    
    public void geraEtiqueta() {
        this.cWhere = "";
        this.cOrder = "";
        msg = null;
        this.conecta = new Conecta();
        boolean lPassa = false;

        String usuario = sessionUser.getUser().getUsername();

        try {
            Map<String, Object> parametros = new HashMap<>();

            if (nrel == 1 || nrel == 2) {
                if (this.selectedCategoria.length == 0) {
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Chamar o Relatório!", "SELECIONE PELO MENOS UMA CATEGORIA ...");
                } else {
                    if (nrel == 1) {
                        this.nomeRelatorio = "relCategoria.jasper";
                        this.nomePDF = "categoria_simples_".concat(usuario).concat(".pdf");
                        msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Chamada ao Relatório efetuada com Sucesso!", "RELATÓRIO SIMPLES");
                    } else {
                        this.nomeRelatorio = "relCategoriaGrupo.jasper";
                        this.nomePDF = "categoria_completo_".concat(usuario).concat(".pdf");
                        msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Chamada ao Relatório efetuada com Sucesso!", "RELATÓRIO COMPLETO");
                    }

                    this.cOrder = " ORDER BY categoria.dsc_categoria ";
                    this.cWhere = " where categoria.id_categoria in ( ";

                    for (Categoria selectedCategoria1 : this.selectedCategoria) {
                        this.cWhere += selectedCategoria1.getIdCategoria() + ",";
                    }
                    this.cWhere += "0) ";
                    lPassa = true;
                }
            } else if (nrel == 3) {
                if (this.selectedCategoriaGrupo.length == 0) {
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Chamar o Relatório!", "SELECIONE PELO MENOS UMA CATEGORIA ...");
                } else {
                    this.nomeRelatorio = "relRamoAtividade.jasper";
                    this.nomePDF = "ramo_atividade_".concat(usuario).concat(".pdf");
                    this.cWhere = " where categoria_grupo.id_grupo in ( ";
                    for (CategoriaGrupo selectedCategoriaGrupo1 : this.selectedCategoriaGrupo) {
                        this.cWhere += selectedCategoriaGrupo1.getIdGrupo() + ",";
                    }
                    this.cWhere += "0) ";
                    if (this.nordem == 1) {
                        this.cOrder = " ORDER BY atividade.descmix ";
                    } else if (this.nordem == 2) {
                        this.cOrder = " ORDER BY atividade.codmix ";
                    } else if (this.nordem == 3) {
                        this.cOrder = " ORDER BY categoria_grupo.dsc_grupo ";
                    }
                    lPassa = true;
                    msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Chamada ao Relatório efetuada com Sucesso!", "RELATÓRIO RAMO DE ATIVIDADE");
                }
            } else if (nrel >= 4 && nrel <= 9) {
                if (this.selectedCategoriaGrupo.length == 0) {
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Chamar o Relatório!", "SELECIONE PELO MENOS UMA CATEGORIA ...");
                } else {
                    lPassa = true;
                    this.cWhere = " where categoria_grupo.id_grupo in ( ";
                    for (CategoriaGrupo selectedCategoriaGrupo1 : this.selectedCategoriaGrupo) {
                        this.cWhere += selectedCategoriaGrupo1.getIdGrupo() + ",";
                    }
                    this.cWhere += "0) ";
                    if (this.nordem == 1) {
                        this.cOrder = " ORDER BY suc ";
                    } else if (this.nordem == 2) {
                        this.cOrder = " ORDER BY fantasia ";
                    } else if (this.nordem == 3) {
                        this.cOrder = " ORDER BY razsoc ";
                    } else if (this.nordem == 4) {
                        this.cOrder = " ORDER BY dsc_grupo ";
                    } else if (this.nordem == 5) {
                        this.cOrder = " ORDER BY contato ";
                    } else if (this.nordem == 6) {
                        this.cOrder = " ORDER BY descmix ";
                    }

                    if (nrel == 4) {
                        this.nomeRelatorio = "etiSuc_simples.jasper";
                        this.nomePDF = "suc_simples_".concat(usuario).concat(".pdf");
                        msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Chamada ao Relatório efetuada com Sucesso!", "RELATÓRIO SUC SIMPLES");
                    } else if (nrel == 5) {
                        this.nomeRelatorio = "etiSuc_completo.jasper";
                        this.nomePDF = "suc_completo_".concat(usuario).concat(".pdf");
                        msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Chamada ao Relatório efetuada com Sucesso!", "RELATÓRIO SUC COMPLETO");
                    } else if (nrel == 6) {
                        this.nomeRelatorio = "etiSuc_intermediaria.jasper";
                        this.nomePDF = "suc_atividade_".concat(usuario).concat(".pdf");
                        msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Chamada ao Relatório efetuada com Sucesso!", "RELATÓRIO SUC POR LISTAGEM INTERMEDIÁRIA");
                    } else if (nrel == 7) {
                        this.nomeRelatorio = "etiSuc_contatos.jasper";
                        this.nomePDF = "suc_razsoc_".concat(usuario).concat(".pdf");
                        msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Chamada ao Relatório efetuada com Sucesso!", "RELATÓRIO SUC POR LISTAGEM DE CONTATOS");
                    } else if (nrel == 8) {
                        this.nomeRelatorio = "etiSuc_padrao.jasper";
                        this.nomePDF = "suc_fantasia_".concat(usuario).concat(".pdf");
                        msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Chamada ao Relatório efetuada com Sucesso!", "RELATÓRIO SUC POR LISTAGEM PADRÃO");
                    } else if (nrel == 9) {
                        this.nomeRelatorio = "etiSuc_fantasia.jasper";
                        this.nomePDF = "suc_suc_".concat(usuario).concat(".pdf");
                        msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Chamada ao Relatório efetuada com Sucesso!", "RELATÓRIO SUC POR SUC FANTASIA");
                    }
                }
            }
            if (lPassa) {
                this.executarRelatorio2(nomeRelatorio, parametros);
            }
            //this.enviarPdf(nomeRelatorio, parametros);
            conecta.close();
        } catch (SQLException ex) {
            Logger.getLogger(RelatorioView.class.getName()).log(Level.SEVERE, null, ex);
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Chamar o Relatório!", "Verifique se o Acrobat Read esta Instalado ...");
        } catch (IOException ex) {
            Logger.getLogger(RelatorioView.class.getName()).log(Level.SEVERE, null, ex);
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Chamar o Relatório!", "Verifique se o Existe Algum Relatório Aberto ...");
        } catch (JRException ex) {
            Logger.getLogger(RelatorioView.class.getName()).log(Level.SEVERE, null, ex);
        } catch (JRRuntimeException ex) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Chamar o Relatório!", "VERIFIQUE SE EXISTE ALGUM RELATÓRIO JÁ ABERTO ...");
        } finally {
            this.nrel = 1;
            this.nordem = 1;
            this.selectedCategoria = null;
            this.selectedCategoriaGrupo = null;
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void enviarPdf(String nomeRelatorio, Map<String, Object> parametros) throws JRException, IOException, SQLException {
        FacesContext context = FacesContext.getCurrentInstance();
        String caminho = "/WEB-INF/relatorios/";
        String relatorio = caminho.concat(nomeRelatorio);

        UtilFaces utilFaces = new UtilFaces();
        String arquivo = utilFaces.getServletContext().getRealPath(relatorio);
        String dirsub = utilFaces.getServletContext().getRealPath(caminho);

        conecta = new Conecta();

        JRAbstractLRUVirtualizer virtualizer = new JRGzipVirtualizer(100);
        // Carrega o xml de definição do relatório
        try {
            HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
            // Configura o response para suportar o relatório
            response.setContentType("application/pdf");
            response.addHeader("Content-disposition", "inline; filename=\"acionista.pdf\"");
            //response.addHeader("Content-disposition", "attachment; filename=\"acionista.pdf\"");

            // Preenche o relatório com os parametros e o data source
            parametros.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);
            parametros.put("SUBREPORT_DIR", dirsub.concat(File.separator));

            //Preenche o relatório e exibe numa GUI
            JasperPrint impressao = JasperFillManager.fillReport(arquivo, parametros, conecta.Conecta());
            // Exporta o relatório
            JasperExportManager.exportReportToPdfStream(impressao, response.getOutputStream());
            // Salva o estado da aplicação no contexto do JSF
            context.getApplication().getStateManager().saveView(context);
            // Fecha o stream do response
            context.responseComplete();
        } finally {
            try {
                conecta.close();
            } catch (SQLException ex) {
                //Logger.getLogger(ReportUtil.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public void executarRelatorio2(String nomeRelatorio, Map<String, Object> parametros) throws JRException, IOException, SQLException {
        String caminho = "/WEB-INF/relatorios/";
        String relatorio = caminho.concat(nomeRelatorio);

        UtilFaces utilFaces = new UtilFaces();
        String arquivo = utilFaces.getServletContext().getRealPath(relatorio);
        String dirsub = utilFaces.getServletContext().getRealPath(caminho);

        JRAbstractLRUVirtualizer virtualizer = new JRGzipVirtualizer(100);

        if (!cWhere.isEmpty()) {
            parametros.put("PAR_WHERE", cWhere);
        }
        if (!cOrder.isEmpty()) {
            parametros.put("PAR_ORDER", cOrder);
        }
        parametros.put("LOGO", dirsub.concat("\\logo_SA_1.jpg"));
        parametros.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);
        parametros.put("SUBREPORT_DIR", dirsub.concat(File.separator));

        //Preenche o relatório e exibe numa GUI
        JasperPrint impressao = JasperFillManager.fillReport(arquivo, parametros, conecta.Conecta());

        preenchePdf(impressao);

        conecta.close();

    }

    public void preenchePdf(JasperPrint print) throws JRException, IOException, JRRuntimeException {
        // Pego o caminho completo do PDF desde a raiz
        saida = getDiretorioReal("/WEB-INF/relatorios/".concat(this.nomePDF));
        // Exporto para PDF
        JasperExportManager.exportReportToPdfFile(print, saida);

        java.awt.Desktop desktop = java.awt.Desktop.getDesktop();

        desktop.open(new File(saida));
    }

    /**
     * M?todo para retornar o caminho completo do diret?rio onde se encontra o
     * arquivo 'jasper' e o arquivo 'pdf'
     *
     * @param diretorio String diret?rio a ser localizado na aplica??o
     * @return String caminho completo
     */
    private String getDiretorioReal(String diretorio) {
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        return session.getServletContext().getRealPath(diretorio);
    }

    /**
     * M?todo para retornar o nome da aplica??o
     *
     * @return String nome da aplicacao
     */
    private String getContextPath() {
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        return session.getServletContext().getContextPath();
    }

    public String getSaida() {
        return saida;
    }

    public void setSaida(String saida) {
        this.saida = saida;
    }

    public int getNrel() {
        return nrel;
    }

    public void setNrel(int nrel) {
        this.nrel = nrel;
    }

    public void atualizaOrdem() {
        if (this.nrel == 6) {
            this.nordem = 6;
        }
    }
}
